package hello.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * Created by Administrator on 2017/8/24.
 * 切面练习类
 * 各种advice的顺序. Around > before > 执行方法 > Around > afterReturning > after
 * @After 可以用于清理现场。比如释放资源等等
 */
@Aspect
public class AspectDeclare {

    @Pointcut("execution(* hello.aspect.AspectTest.*(..))") //从前到后的正则意义: 方法的返回类型--包名--类名--所有方法
    public void printMessage() {
    }

    @Before(value = "printMessage()")
    public void before(JoinPoint joinPoint) throws Exception{
        System.out.println("先于这个之前执行" + joinPoint.getSignature().getName());
    }

    /** afterReturning:后置通知(应用：常规数据处理)
     　　　　方法正常返回后执行，如果方法中抛出异常，通知无法执行，必须在方法执行后才执行，所以可以获得方法的返回值。*/
    @AfterReturning(value = "execution(* hello.aspect.AspectTest.*(..))", returning = "ret")
    public void afterReturning(JoinPoint joinPoint, Object ret) {
        System.out.println("后置通知:" + joinPoint.getSignature().getName() + " ---returning value:" + ret);
    }

    /**
     *  around:环绕通知(应用：十分强大，可以做任何事情)
     *　　　方法执行前后分别执行，可以阻止方法的执行，必须手动执行目标方法
     */
    @Around("printMessage()")
    public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕执行前");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("环绕执行后");
        return obj;
    }


}
